package com.errol.generic.baiducloud.portraitai.pojo;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.renjia.service.generic.baiducloud.basic.pojo.AbstractBaiduApiResultDTO;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.util.List;

/**
 * 百度人像分割接口返回值对象
 *
 * @author zhang xiao bin
 * @version v1.0
 * @date 2020/09/21
 * @since v
 **/
@Data
@EqualsAndHashCode(callSuper = true)
public class BaiduPortraitSegmentResultDTO extends AbstractBaiduApiResultDTO {
    public enum ResultStatus {
        /**
         * 成功返回结果
         */
        SUCCESS,
        /**
         * 执行失败，包括抛出异常和接口返回错误码
         */
        FAILURE,
        /**
         * 照片 base64 编码后超过 4M
         */
        IMAGE_TOO_BIG,
    }

    /**
     * result 状态码
     */
    private ResultStatus status;
    /**
     * 唯一的log id，用于问题定位
     */
    @JsonProperty(value = "log_id")
    private Long logId;
    /**
     * 分割结果图片，base64编码之后的二值图像，需二次处理方能查看分割效果
     */
    @JsonProperty(value = "labelmap")
    private String labelMap;
    /**
     * 分割后人像前景的scoremap，归一到0-255，不用进行二次处理，直接解码保存图片即可。Base64编码后的灰度图文件，
     * 图片中每个像素点的灰度值 = 置信度 * 255，置信度为原图对应像素点位于人体轮廓内的置信度，取值范围[0, 1]
     */
    @JsonProperty(value = "scoremap")
    private String scoreMap;
    /**
     * 分割后的人像前景抠图，透明背景，Base64编码后的png格式图片，不用进行二次处理，直接解码保存图片即可。
     * 将置信度大于0.5的像素抠出来，并通过image matting技术消除锯齿
     */
    private String foreground;
    /**
     * 检测到的人体框数目
     * 此返回值必定有值，其他参数都可能为空
     */
    @JsonProperty(value = "person_num")
    private Integer personNum;
    /**
     * 人体框信息
     */
    @JsonProperty(value = "person_info")
    private List<PersonInfo> personInfos;

    @Data
    public static class PersonInfo {
        /**
         * 人体框的概率分数，取值0-1
         */
        private float score;
        /**
         * 人体区域离左边界的距离
         */
        private float left;
        /**
         * 人体区域离上边界的距离
         */
        private float top;
        /**
         * 人体区域的宽度
         */
        private float width;
        /**
         * 人体区域的高度
         */
        private float height;
    }

    public BaiduPortraitSegmentResultDTO() {
    }

    public BaiduPortraitSegmentResultDTO(ResultStatus status) {
        this.status = status;
    }
}
